from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from time import sleep
import os, datetime, json, pprint

def write_bilibili_video_data(item):
    """
    文件存储到本地
    source_dir为存储的目标文件夹
    target_dir为存储的目标文件
    datetime.datetime.now()模块中的类的now()方法，表示单去日期和时间，
    strftime("%Y%m%d")是datetime对象的一个方法，用于将日期时间格式化成字符串
    "{}.txt".format（）是字符串的format方法，用于格式化字符串，{}是一个占位符，会被后面的日期替换
    with ... as...是上下文管理器，优势在于自动管理文件的关闭，打开文件追加内容，使用通用字符编码格式，可以显示几乎所有的语言
    """
    source_dir = 'video_data'
    target_dir = os.path.join(source_dir, item['videoid'])
    if not os.path.exists(target_dir):
        os.mkdir(target_dir)
    file_name = "{}.txt".format(datetime.datetime.now().strftime("%Y%m%d"))
    file_path = os.path.join(target_dir, file_name)
    with open(file_path, mode='a', encoding='utf8')as file_name:
        file_name.write(json.dumps(item, ensure_ascii=False, indent=4))
        file_name.write('\n')

def main():
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--window-size=3840,2160')
    prefs = {'profile.managed_default_content_settings.images': 2}
    chrome_options.add_experimental_option('prefs', prefs)
    driver = webdriver.Chrome(options=chrome_options)
    driver.get('https://www.bilibili.com')

    feed_card = driver.find_elements(By.XPATH, './/div[@class="feed-card"]')
    # print(feed_card) #用于判断上一段代码是否执行成功
    './/div[@class="feed-card"]/div/div[2]/div/a'

    for card in feed_card:
        """爬取网站对应的元素及格式化输出"""
        item = {}
        item['标题'] = card.find_element(By.XPATH, './/div/div[2]/div/div[2]/div/h3/a').text
        item['链接'] = card.find_element(By.XPATH, './/div/div[2]/div/a').get_attribute('href')
        item['videoid'] = item['链接'].split('/')[-1]
        item['播放人数'] = card.find_element(By.XPATH, './/div/div[2]/div/a/div/div[2]/div[@class]/div/span/span').text
        item['弹幕数量'] = card.find_element(By.XPATH, './/div/div[2]/div/a/div/div[2]/div[@class]/div/span[2]/span').text
        item['作者'] = card.find_element(By.XPATH, './/div/div[2]/div/div[2]/div/div[2]/a/span').text
        item['日期'] = card.find_element(By.XPATH, './/div/div[2]/div/div[2]/div/div[2]/a/span[2]').text
        print(json.dumps(item, ensure_ascii=False, indent=4))
        write_bilibili_video_data(item)


    driver.quit()

if __name__ == '__main__':
    """
    1.测试代码隔离，此位置是存放测试代码，避模块被导入时，此代码被运行
    2.定义程序入口
    """
    main()

